package com.yinsin.utils;

/**
 * <ul>
 * <li>表名转换实体名，默认以'_'为分隔符</li>
 * <li>表名转换实体名，自定义分隔符</li>
 * <li>实体名转表名，默认以“_”下划线分隔</li>
 * <li>实体名转表名，自定义表名分隔符</li>
 * <li>实体类属性名转换为表字段名</li>
 * <li>数据库表字段名转换为实体类属性名</li>
 * <li>将jdbcType转换为javaType</li>
 * <li>将javaType转换为jdbcType，只针对Mysql，此方法局限性较大，不建议使用</li>
 * </ul>
 * @author Yisin
 * @version 1.0
 */
public class DbUtils {
    
    /**
     * 表名转换实体名，默认以'_'为分隔符
     * @param table 表名
     * @return 实体名
     */
    public static String tableToEntity(String table) {
        return tableToEntity(table, "_");
    }
    
    /**
     * 表名转换实体名，自定义分隔符
     * @param table 表名
     * @param split 分隔符
     * @return 实体名
     */
    public static String tableToEntity(String table, String split) {
        String entity = "";
        if (table != null && table.length() > 1) {
            if (table.indexOf(split) != -1) {
                String[] strs = table.split(split);
                for (int i = 0; i < strs.length; i++) {
                    if (strs[i] != null && strs[i].length() > 0) {
                        entity += CommonUtils.firstCharToUpperCase(strs[i]);
                    }
                }
            } else {
                entity = CommonUtils.firstCharToUpperCase(table);
            }
            if (entity.matches("[A-Z]+")) {
                entity = CommonUtils.firstCharToUpperCase(entity.toLowerCase());
            }
        }
        return entity;
    }

    /**
     * 实体名转表名，默认以“_”下划线分隔
     * @param entity 实体名
     * @return 表名
     */
    public static String entityToTable(String entity) {
        return entityToTable(entity, "_");
    }
    
    /**
     * 实体名转表名，自定义表名分隔符
     * @param entity 实体名
     * @param split 分隔符
     * @return 表名
     */
    public static String entityToTable(String entity, String split) {
        String table = null;
        if (entity != null && entity.length() > 1) {
            table = entity.replaceAll("[A-Z]", split + "$0").toLowerCase();
        }
        return table;
    }

    /**
     * 实体类属性名转换为表字段名
     * @param feild 属性名
     * @return 数据库表字段名
     */
    public static String feildToColumn(String feild) {
        return entityToTable(feild);
    }

    /**
     * 数据库表字段名转换为实体类属性名
     * @param column 数据库表字段名
     * @return  实体类属性名
     */
    public static String columnToFeild(String column) {
        return CommonUtils.firstCharToLowerCase(tableToEntity(column));
    }

    /**
     * 将jdbcType转换为javaType
     * @param jdbcType
     * @return javaType
     */
    public static String getJavaType(String jdbcType) {
        String javaType = Constants.OBJECT;
        if (jdbcType.equalsIgnoreCase("varchar") || jdbcType.equalsIgnoreCase("char")) {
            javaType = Constants.STRING;
        } else if (jdbcType.equalsIgnoreCase("int") || jdbcType.equalsIgnoreCase("integer")) {
            javaType = Constants.INTEGER;
        } else if (jdbcType.equalsIgnoreCase("long") || jdbcType.equalsIgnoreCase("bigint")) {
            javaType = Constants.LONG;
        } else if (jdbcType.equalsIgnoreCase("float") || jdbcType.equalsIgnoreCase("number")) {
            javaType = Constants.FLOAT;
        } else if (jdbcType.equalsIgnoreCase("double") || jdbcType.equalsIgnoreCase("decimal")) {
            javaType = Constants.DOUBLE;
        } else if (jdbcType.equalsIgnoreCase("date")) {
            javaType = Constants.DATE;
        } else if (jdbcType.equalsIgnoreCase("timestamp") || jdbcType.equalsIgnoreCase("time")) {
            javaType = Constants.TIMESTAMP;
        } else if (jdbcType.equalsIgnoreCase("blob")) {
            javaType = Constants.LBYTE;
        }
        return javaType;
    }
    
    /**
     * 将javaType转换为jdbcType，只针对Mysql，此方法局限性较大，不建议使用
     * @param javaType
     * @return jdbcType
     */
    public static String getJdbcType(String javaType) {
        String jdbcType = Constants.OBJECT;
        if (javaType.equalsIgnoreCase("String")) {
            jdbcType = "varchar";
        } else if (javaType.equalsIgnoreCase("int") || javaType.equalsIgnoreCase("integer")) {
            jdbcType = "int";
        } else if (javaType.equalsIgnoreCase("long")) {
            jdbcType = "bigint";
        } else if (javaType.equalsIgnoreCase("float")) {
            jdbcType = "number";
        } else if (javaType.equalsIgnoreCase("double")) {
            jdbcType = "decimal";
        } else if (javaType.equalsIgnoreCase("date")) {
            jdbcType = "date";
        } else if (javaType.equalsIgnoreCase("timestamp") || javaType.equalsIgnoreCase("time")) {
            jdbcType = "timestamp";
        } else if (javaType.equalsIgnoreCase("Lbyte")) {
            jdbcType = "blob";
        }
        return jdbcType;
    }
}
